{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# KNN算法\n",
    "\n",
    "K临近算法"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "\n",
    "data = np.array([\n",
    "    [11, 1],\n",
    "    [150, 2],\n",
    "    [200, 3],\n",
    "    [275, 4],\n",
    "    [325, 4],\n",
    "    [450, 5],\n",
    "    [500, 5],\n",
    "    [550, 5]\n",
    "])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1],\n",
       "       [2],\n",
       "       [3],\n",
       "       [4],\n",
       "       [4],\n",
       "       [5],\n",
       "       [5],\n",
       "       [5]])"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 拆分数据集 feature, label\n",
    "feature = data[:,:1]\n",
    "label = data[:,-1:]\n",
    "\n",
    "label"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[289],\n",
       "       [150],\n",
       "       [100],\n",
       "       [ 25],\n",
       "       [ 25],\n",
       "       [150],\n",
       "       [200],\n",
       "       [250]])"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 要预测的点\n",
    "predict_point = np.array([300])\n",
    "# feature与预测点的距离\n",
    "distance_data = np.abs(feature-predict_point)\n",
    "distance_data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 排序\n",
    "index = np.argsort(distance_data, axis=0).ravel()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[4],\n",
       "       [4],\n",
       "       [3],\n",
       "       [2],\n",
       "       [5],\n",
       "       [5],\n",
       "       [5],\n",
       "       [1]])"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 根据索引取出label中对应index位置的数据值\n",
    "# 看落入了那个框\n",
    "label[index]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0, 0, 1, 1, 2])"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "k = 4\n",
    "bin_count_arr = np.bincount(label[index][:k].ravel())\n",
    "bin_count_arr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.argmax(bin_count_arr)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "## KNN算法函数封装\n",
    "\n",
    "def knn(feature, label, predict_point, k):\n",
    "    # feature与预测点的距离\n",
    "    distance_data = np.abs(feature-predict_point)\n",
    "    # 排序\n",
    "    index = np.argsort(distance_data, axis=0).ravel()\n",
    "    # 根据index获取对应label的列表 label[index]\n",
    "    # 统计label出现频率最多的k个值\n",
    "    bin_count_arr = np.bincount(label[index][:k].ravel())\n",
    "    return np.argmax(bin_count_arr)\n",
    "\n",
    "knn(feature, label, predict_point, 3)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 加载真实数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 27.  ,   0.5 ,  16.01,   4.  ],\n",
       "       [ 19.  ,   0.52,  16.  ,   3.  ],\n",
       "       [374.  ,   0.54,  16.  ,   6.  ],\n",
       "       ...,\n",
       "       [153.  ,   0.5 ,  16.  ,   2.  ],\n",
       "       [247.  ,   0.5 ,  16.  ,   1.  ],\n",
       "       [115.  ,   0.54,  16.  ,   4.  ]])"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data = np.loadtxt('data3.csv', delimiter=',')\n",
    "data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "在 [300] 位置扔球，预测结果为：4\n"
     ]
    }
   ],
   "source": [
    "feature = data[:,:1]\n",
    "label = data[:,-1:].astype(int)\n",
    "predict_point = 300\n",
    "result = knn(feature,label,predict_point, 10)\n",
    "print(f\"在 [{predict_point}] 位置扔球，预测结果为：{result}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 如何优化训练模型\n",
    "1. 修改超级参数\n",
    "2. 增加模型复杂度，添加新的feature\n",
    "3. 修改预测点\n",
    "4. 修改模型\n",
    "5. 提升数据集合质量\n",
    "6. 接受糟糕的预测结果"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 判断模型的好坏\n",
    "\n",
    "### 拆分数据集：训练集和测试集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1265\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([[184.  ,   0.54,  16.  ,   1.  ],\n",
       "       [273.  ,   0.54,  16.  ,   3.  ],\n",
       "       [ 68.  ,   0.54,  16.  ,   2.  ],\n",
       "       ...,\n",
       "       [115.  ,   0.51,  16.  ,   2.  ],\n",
       "       [364.  ,   0.54,  16.  ,   2.  ],\n",
       "       [ 39.  ,   0.51,  16.  ,   2.  ]])"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data = np.loadtxt('data3.csv', delimiter=',')\n",
    "np.random.seed(8)\n",
    "np.random.shuffle(data)\n",
    "print(len(data))\n",
    "data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1145 120\n"
     ]
    }
   ],
   "source": [
    "# 末尾120条作为测试集，其他作为训练集\n",
    "test_data = data[-120:] # 测试\n",
    "train_data = data[:-120]# 训练\n",
    "print(len(train_data), len(test_data))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 用测试集去评估knn算法的准确率\n",
    "def test_accuray(k):\n",
    "    right_count = 0\n",
    "    # 对每一条测试集里的数据进行预测\n",
    "    for item in test_data:\n",
    "        # 预测指定位置落入的篮筐\n",
    "        predict = knn(train_data[:,:1], train_data[:, -1:].astype(int), item[0], k)\n",
    "        # 真实值\n",
    "        real = int(item[-1])\n",
    "        \n",
    "        if predict == real:\n",
    "            right_count += 1\n",
    "            \n",
    "    accuray = right_count / len(test_data)\n",
    "    print(\"K={}, 预测精确度为：{}\".format(k, accuray))\n",
    "    return accuray\n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "K=10, 预测精确度为：0.2916666666666667\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "0.2916666666666667"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "k = 10\n",
    "test_accuray(k)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "K=5, 预测精确度为：0.3\n",
      "K=6, 预测精确度为：0.2916666666666667\n",
      "K=7, 预测精确度为：0.3\n",
      "K=8, 预测精确度为：0.31666666666666665\n",
      "K=9, 预测精确度为：0.30833333333333335\n",
      "K=10, 预测精确度为：0.2916666666666667\n",
      "K=11, 预测精确度为：0.26666666666666666\n",
      "K=12, 预测精确度为：0.26666666666666666\n",
      "K=13, 预测精确度为：0.3\n",
      "K=14, 预测精确度为：0.25833333333333336\n",
      "K=15, 预测精确度为：0.21666666666666667\n",
      "K=16, 预测精确度为：0.25\n",
      "K=17, 预测精确度为：0.25833333333333336\n",
      "K=18, 预测精确度为：0.23333333333333334\n",
      "K=19, 预测精确度为：0.25\n",
      "K=20, 预测精确度为：0.23333333333333334\n",
      "K=21, 预测精确度为：0.23333333333333334\n",
      "K=22, 预测精确度为：0.23333333333333334\n",
      "K=23, 预测精确度为：0.21666666666666667\n",
      "K=24, 预测精确度为：0.24166666666666667\n",
      "K=25, 预测精确度为：0.24166666666666667\n",
      "K=26, 预测精确度为：0.24166666666666667\n",
      "K=27, 预测精确度为：0.25833333333333336\n",
      "K=28, 预测精确度为：0.26666666666666666\n",
      "K=29, 预测精确度为：0.26666666666666666\n",
      "K=30, 预测精确度为：0.25833333333333336\n",
      "K=31, 预测精确度为：0.23333333333333334\n",
      "K=32, 预测精确度为：0.225\n",
      "K=33, 预测精确度为：0.225\n",
      "K=34, 预测精确度为：0.20833333333333334\n",
      "K=35, 预测精确度为：0.21666666666666667\n",
      "K=36, 预测精确度为：0.225\n",
      "K=37, 预测精确度为：0.225\n",
      "K=38, 预测精确度为：0.23333333333333334\n",
      "K=39, 预测精确度为：0.24166666666666667\n",
      "K=40, 预测精确度为：0.25\n",
      "K=41, 预测精确度为：0.24166666666666667\n",
      "K=42, 预测精确度为：0.25\n",
      "K=43, 预测精确度为：0.23333333333333334\n",
      "K=44, 预测精确度为：0.25\n",
      "K=45, 预测精确度为：0.24166666666666667\n",
      "K=46, 预测精确度为：0.25833333333333336\n",
      "K=47, 预测精确度为：0.26666666666666666\n",
      "K=48, 预测精确度为：0.26666666666666666\n",
      "K=49, 预测精确度为：0.25833333333333336\n",
      "K=50, 预测精确度为：0.24166666666666667\n",
      "K=51, 预测精确度为：0.24166666666666667\n",
      "K=52, 预测精确度为：0.26666666666666666\n",
      "K=53, 预测精确度为：0.24166666666666667\n",
      "K=54, 预测精确度为：0.26666666666666666\n",
      "K=55, 预测精确度为：0.23333333333333334\n",
      "K=56, 预测精确度为：0.24166666666666667\n",
      "K=57, 预测精确度为：0.24166666666666667\n",
      "K=58, 预测精确度为：0.24166666666666667\n",
      "K=59, 预测精确度为：0.24166666666666667\n",
      "K=60, 预测精确度为：0.24166666666666667\n",
      "K=61, 预测精确度为：0.24166666666666667\n",
      "K=62, 预测精确度为：0.23333333333333334\n",
      "K=63, 预测精确度为：0.23333333333333334\n",
      "K=64, 预测精确度为：0.21666666666666667\n",
      "K=65, 预测精确度为：0.21666666666666667\n",
      "K=66, 预测精确度为：0.20833333333333334\n",
      "K=67, 预测精确度为：0.225\n",
      "K=68, 预测精确度为：0.24166666666666667\n",
      "K=69, 预测精确度为：0.225\n",
      "K=70, 预测精确度为：0.225\n",
      "K=71, 预测精确度为：0.23333333333333334\n",
      "K=72, 预测精确度为：0.23333333333333334\n",
      "K=73, 预测精确度为：0.23333333333333334\n",
      "K=74, 预测精确度为：0.23333333333333334\n",
      "K=75, 预测精确度为：0.21666666666666667\n",
      "K=76, 预测精确度为：0.21666666666666667\n",
      "K=77, 预测精确度为：0.21666666666666667\n",
      "K=78, 预测精确度为：0.225\n",
      "K=79, 预测精确度为：0.21666666666666667\n",
      "K=80, 预测精确度为：0.21666666666666667\n",
      "K=81, 预测精确度为：0.2\n",
      "K=82, 预测精确度为：0.2\n",
      "K=83, 预测精确度为：0.21666666666666667\n",
      "K=84, 预测精确度为：0.225\n",
      "K=85, 预测精确度为：0.23333333333333334\n",
      "K=86, 预测精确度为：0.21666666666666667\n",
      "K=87, 预测精确度为：0.2\n",
      "K=88, 预测精确度为：0.2\n",
      "K=89, 预测精确度为：0.21666666666666667\n",
      "K=90, 预测精确度为：0.20833333333333334\n",
      "K=91, 预测精确度为：0.20833333333333334\n",
      "K=92, 预测精确度为：0.2\n",
      "K=93, 预测精确度为：0.2\n",
      "K=94, 预测精确度为：0.18333333333333332\n",
      "K=95, 预测精确度为：0.2\n",
      "K=96, 预测精确度为：0.18333333333333332\n",
      "K=97, 预测精确度为：0.21666666666666667\n",
      "K=98, 预测精确度为：0.20833333333333334\n",
      "K=99, 预测精确度为：0.21666666666666667\n",
      "当K=8, 精确度最高为：0.31666666666666665\n"
     ]
    }
   ],
   "source": [
    "max_rst = -1\n",
    "max_k = -1\n",
    "for i in range(5,100):\n",
    "    rst = test_accuray(i)\n",
    "    if rst > max_rst:\n",
    "        max_k = i\n",
    "        max_rst = rst\n",
    "        \n",
    "print(\"当K={}, 精确度最高为：{}\".format(max_k, max_rst))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 引入弹性因素实现KNN"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[184.  ,   0.54,  16.  ,   1.  ],\n",
       "       [273.  ,   0.54,  16.  ,   3.  ],\n",
       "       [ 68.  ,   0.54,  16.  ,   2.  ],\n",
       "       ...,\n",
       "       [115.  ,   0.51,  16.  ,   2.  ],\n",
       "       [364.  ,   0.54,  16.  ,   2.  ],\n",
       "       [ 39.  ,   0.51,  16.  ,   2.  ]])"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data = np.loadtxt(\"data3.csv\", delimiter=\",\")\n",
    "np.random.seed(8)\n",
    "np.random.shuffle(data)\n",
    "data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[184.  ,   0.54],\n",
       "       [273.  ,   0.54],\n",
       "       [ 68.  ,   0.54],\n",
       "       ...,\n",
       "       [115.  ,   0.51],\n",
       "       [364.  ,   0.54],\n",
       "       [ 39.  ,   0.51]])"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "feature = data[:, :2] # 只取位置和弹性两个维度数据\n",
    "feature"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1.],\n",
       "       [3.],\n",
       "       [2.],\n",
       "       ...,\n",
       "       [2.],\n",
       "       [2.],\n",
       "       [2.]])"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "label = data[:, -1:]\n",
    "label"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 拆分训练集\n",
    "trainX = feature[0:-120]\n",
    "trainY = label[0:-120]\n",
    "# 拆分测试集，末尾120条数据\n",
    "testX = feature[-120:]\n",
    "testY = label[-120:]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([184.  ,   0.54])"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "trainX[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-116.  ,    0.02])"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.set_printoptions(suppress=True)\n",
    "\n",
    "predict_point = np.array([300, 0.52])\n",
    "\n",
    "trainX[0] - predict_point"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([13456.    ,     0.0004])"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.square(trainX[0] - predict_point)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "13456.0004"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 差异的平方和\n",
    "np.sum(np.square(trainX[0] - predict_point))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "116.00000172413792"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 开方\n",
    "np.sqrt(np.sum(np.square(trainX[0] - predict_point)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 将knn算法扩展成多个维度的情况\n",
    "def knn(feature, label, predict_point, k):\n",
    "    # feature与预测点的距离\n",
    "    distance_data = np.sqrt(np.sum(np.square(feature - predict_point), axis=1))\n",
    "    # 排序\n",
    "    index = np.argsort(distance_data, axis=0).reshape(1, -1)[0]\n",
    "    # 根据index获取对应label的列表 label[index]\n",
    "    # 统计label出现频率最多的k个值\n",
    "    bin_count_arr = np.bincount(label[index][0:k].astype(int).reshape(1, -1)[0])\n",
    "    return np.argmax(bin_count_arr)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "k=2, 准确率=0.30833333333333335\n"
     ]
    }
   ],
   "source": [
    "# 测试模型\n",
    "def test_accuray(k):\n",
    "    right_count = 0\n",
    "    for index, item in enumerate(testX):\n",
    "        predict = knn(trainX, trainY.astype(int), item, k)\n",
    "        real = int(testY[index])\n",
    "#         print(predict, real)\n",
    "        if predict == real:\n",
    "            right_count += 1\n",
    "            \n",
    "    print(\"k={}, 准确率={}\".format(k, right_count/len(testX)))\n",
    "        \n",
    "test_accuray(2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "k=2, 准确率=0.30833333333333335\n",
      "k=3, 准确率=0.38333333333333336\n",
      "k=4, 准确率=0.3416666666666667\n",
      "k=5, 准确率=0.36666666666666664\n",
      "k=6, 准确率=0.35833333333333334\n",
      "k=7, 准确率=0.35833333333333334\n",
      "k=8, 准确率=0.325\n",
      "k=9, 准确率=0.31666666666666665\n",
      "k=10, 准确率=0.31666666666666665\n",
      "k=11, 准确率=0.31666666666666665\n",
      "k=12, 准确率=0.3\n",
      "k=13, 准确率=0.2833333333333333\n",
      "k=14, 准确率=0.25833333333333336\n",
      "k=15, 准确率=0.25833333333333336\n",
      "k=16, 准确率=0.25833333333333336\n",
      "k=17, 准确率=0.21666666666666667\n",
      "k=18, 准确率=0.23333333333333334\n",
      "k=19, 准确率=0.25\n",
      "k=20, 准确率=0.225\n",
      "k=21, 准确率=0.21666666666666667\n",
      "k=22, 准确率=0.24166666666666667\n",
      "k=23, 准确率=0.23333333333333334\n",
      "k=24, 准确率=0.25\n",
      "k=25, 准确率=0.26666666666666666\n",
      "k=26, 准确率=0.26666666666666666\n",
      "k=27, 准确率=0.24166666666666667\n",
      "k=28, 准确率=0.25833333333333336\n",
      "k=29, 准确率=0.26666666666666666\n",
      "k=30, 准确率=0.24166666666666667\n",
      "k=31, 准确率=0.26666666666666666\n",
      "k=32, 准确率=0.24166666666666667\n",
      "k=33, 准确率=0.225\n",
      "k=34, 准确率=0.23333333333333334\n",
      "k=35, 准确率=0.23333333333333334\n",
      "k=36, 准确率=0.21666666666666667\n",
      "k=37, 准确率=0.225\n",
      "k=38, 准确率=0.20833333333333334\n",
      "k=39, 准确率=0.225\n",
      "k=40, 准确率=0.23333333333333334\n",
      "k=41, 准确率=0.24166666666666667\n",
      "k=42, 准确率=0.23333333333333334\n",
      "k=43, 准确率=0.225\n",
      "k=44, 准确率=0.24166666666666667\n",
      "k=45, 准确率=0.275\n",
      "k=46, 准确率=0.26666666666666666\n",
      "k=47, 准确率=0.26666666666666666\n",
      "k=48, 准确率=0.26666666666666666\n",
      "k=49, 准确率=0.25833333333333336\n",
      "k=50, 准确率=0.24166666666666667\n",
      "k=51, 准确率=0.225\n",
      "k=52, 准确率=0.24166666666666667\n",
      "k=53, 准确率=0.24166666666666667\n",
      "k=54, 准确率=0.24166666666666667\n",
      "k=55, 准确率=0.24166666666666667\n",
      "k=56, 准确率=0.23333333333333334\n",
      "k=57, 准确率=0.23333333333333334\n",
      "k=58, 准确率=0.21666666666666667\n",
      "k=59, 准确率=0.225\n",
      "k=60, 准确率=0.21666666666666667\n",
      "k=61, 准确率=0.20833333333333334\n",
      "k=62, 准确率=0.2\n",
      "k=63, 准确率=0.21666666666666667\n",
      "k=64, 准确率=0.23333333333333334\n",
      "k=65, 准确率=0.225\n",
      "k=66, 准确率=0.19166666666666668\n",
      "k=67, 准确率=0.2\n",
      "k=68, 准确率=0.20833333333333334\n",
      "k=69, 准确率=0.21666666666666667\n",
      "k=70, 准确率=0.21666666666666667\n",
      "k=71, 准确率=0.20833333333333334\n",
      "k=72, 准确率=0.20833333333333334\n",
      "k=73, 准确率=0.23333333333333334\n",
      "k=74, 准确率=0.225\n",
      "k=75, 准确率=0.21666666666666667\n",
      "k=76, 准确率=0.20833333333333334\n",
      "k=77, 准确率=0.20833333333333334\n",
      "k=78, 准确率=0.225\n",
      "k=79, 准确率=0.20833333333333334\n",
      "k=80, 准确率=0.19166666666666668\n",
      "k=81, 准确率=0.2\n",
      "k=82, 准确率=0.19166666666666668\n",
      "k=83, 准确率=0.18333333333333332\n",
      "k=84, 准确率=0.20833333333333334\n",
      "k=85, 准确率=0.21666666666666667\n",
      "k=86, 准确率=0.21666666666666667\n",
      "k=87, 准确率=0.21666666666666667\n",
      "k=88, 准确率=0.20833333333333334\n",
      "k=89, 准确率=0.23333333333333334\n",
      "k=90, 准确率=0.23333333333333334\n",
      "k=91, 准确率=0.21666666666666667\n",
      "k=92, 准确率=0.20833333333333334\n",
      "k=93, 准确率=0.2\n",
      "k=94, 准确率=0.19166666666666668\n",
      "k=95, 准确率=0.175\n",
      "k=96, 准确率=0.18333333333333332\n",
      "k=97, 准确率=0.18333333333333332\n",
      "k=98, 准确率=0.2\n",
      "k=99, 准确率=0.19166666666666668\n"
     ]
    }
   ],
   "source": [
    "for k in range(2, 100):\n",
    "    test_accuray(k)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "6"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "predict_point = np.array([300, 0.52])\n",
    "num = knn(trainX, trainY, predict_point, 3)\n",
    "num"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 数据预处理"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 数据归一化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 27.  ,   0.5 ,  16.01],\n",
       "       [ 19.  ,   0.52,  16.  ],\n",
       "       [374.  ,   0.54,  16.  ],\n",
       "       [270.  ,   0.54,  16.  ],\n",
       "       [342.  ,   0.5 ,  16.  ]])"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data = np.loadtxt(\"data3.csv\", delimiter=\",\")\n",
    "data = data[:5, :3]\n",
    "data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 27.  ,  19.  , 374.  , 270.  , 342.  ],\n",
       "       [  0.5 ,   0.52,   0.54,   0.54,   0.5 ],\n",
       "       [ 16.01,  16.  ,  16.  ,  16.  ,  16.  ]])"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.T"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([19. ,  0.5, 16. ])"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.min(data.T, axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([374.  ,   0.54,  16.01])"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.max(data.T, axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0.02253521, 0.        , 1.        ],\n",
       "       [0.        , 0.5       , 0.        ],\n",
       "       [1.        , 1.        , 0.        ],\n",
       "       [0.70704225, 1.        , 0.        ],\n",
       "       [0.90985915, 0.        , 0.        ]])"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "(data - np.min(data.T, axis=1)) / (np.max(data.T, axis=1) - np.min(data.T, axis=1))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [],
   "source": [
    "def min_max(input):\n",
    "    return (input - np.min(input.T, axis=1)) / (np.max(input.T, axis=1) - np.min(input.T, axis=1))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[0.02253521 0.         1.        ]\n",
      " [0.         0.5        0.        ]\n",
      " [1.         1.         0.        ]\n",
      " [0.70704225 1.         0.        ]\n",
      " [0.90985915 0.         0.        ]]\n"
     ]
    }
   ],
   "source": [
    "print(min_max(data))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 数据标准化\n",
    "\n",
    "- 数据离散程度大，间隙大，或者数据非常集中，间隙小，考虑采用标准化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [],
   "source": [
    "def standration(a):\n",
    "    return (a - np.mean(a)) / np.std(a)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-2.23606798,  0.44718945,  0.44720286,  0.44721628,  0.44722969,\n",
       "        0.44722969])"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "b = np.array([-200000, 5,6,7,8, 8.00002])\n",
    "\n",
    "standration(b)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 优化数据，进行归一化之后再进行Knn计算"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "metadata": {},
   "outputs": [],
   "source": [
    "data = np.loadtxt(\"data3.csv\", delimiter=\",\")\n",
    "# np.random.seed(8)\n",
    "np.random.shuffle(data)\n",
    "\n",
    "train_data = data[0:-120] # 训练集\n",
    "test_data  = data[-120:]  # 测试集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 19.  ,   0.52],\n",
       "       [253.  ,   0.55],\n",
       "       [306.  ,   0.51],\n",
       "       ...,\n",
       "       [276.  ,   0.5 ],\n",
       "       [190.  ,   0.5 ],\n",
       "       [322.  ,   0.51]])"
      ]
     },
     "execution_count": 71,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_feature = train_data[:, 0:2]\n",
    "train_feature"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0.01298701, 0.4       ],\n",
       "       [0.51948052, 1.        ],\n",
       "       [0.63419913, 0.2       ],\n",
       "       ...,\n",
       "       [0.56926407, 0.        ],\n",
       "       [0.38311688, 0.        ],\n",
       "       [0.66883117, 0.2       ]])"
      ]
     },
     "execution_count": 72,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_feature = min_max(train_feature)\n",
    "train_feature"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[208.  ,   0.53],\n",
       "       [324.  ,   0.54],\n",
       "       [ 38.  ,   0.5 ],\n",
       "       [ 23.  ,   0.52],\n",
       "       [289.  ,   0.55],\n",
       "       [289.  ,   0.53],\n",
       "       [ 85.  ,   0.51],\n",
       "       [270.  ,   0.51],\n",
       "       [247.  ,   0.53],\n",
       "       [456.  ,   0.55],\n",
       "       [255.  ,   0.52],\n",
       "       [ 57.  ,   0.5 ],\n",
       "       [136.  ,   0.54],\n",
       "       [ 19.  ,   0.54],\n",
       "       [221.  ,   0.53],\n",
       "       [ 57.  ,   0.52],\n",
       "       [ 91.  ,   0.51],\n",
       "       [247.  ,   0.52],\n",
       "       [408.  ,   0.52],\n",
       "       [243.  ,   0.51],\n",
       "       [286.  ,   0.52],\n",
       "       [ 91.  ,   0.5 ],\n",
       "       [108.  ,   0.51],\n",
       "       [182.  ,   0.52],\n",
       "       [437.  ,   0.51],\n",
       "       [455.  ,   0.53],\n",
       "       [207.  ,   0.55],\n",
       "       [322.  ,   0.54],\n",
       "       [437.  ,   0.52],\n",
       "       [368.  ,   0.51],\n",
       "       [ 27.  ,   0.51],\n",
       "       [204.  ,   0.53],\n",
       "       [207.  ,   0.53],\n",
       "       [351.  ,   0.53],\n",
       "       [260.  ,   0.53],\n",
       "       [270.  ,   0.52],\n",
       "       [189.  ,   0.53],\n",
       "       [273.  ,   0.53],\n",
       "       [299.  ,   0.51],\n",
       "       [ 51.  ,   0.54],\n",
       "       [ 54.  ,   0.54],\n",
       "       [ 81.  ,   0.54],\n",
       "       [405.  ,   0.5 ],\n",
       "       [195.  ,   0.51],\n",
       "       [ 95.  ,   0.52],\n",
       "       [135.  ,   0.53],\n",
       "       [143.  ,   0.52],\n",
       "       [299.  ,   0.53],\n",
       "       [425.  ,   0.55],\n",
       "       [455.  ,   0.51],\n",
       "       [345.  ,   0.53],\n",
       "       [208.  ,   0.54],\n",
       "       [207.  ,   0.51],\n",
       "       [130.  ,   0.54],\n",
       "       [208.  ,   0.54],\n",
       "       [425.  ,   0.51],\n",
       "       [286.  ,   0.53],\n",
       "       [416.  ,   0.52],\n",
       "       [ 52.  ,   0.54],\n",
       "       [323.  ,   0.54],\n",
       "       [460.  ,   0.53],\n",
       "       [189.  ,   0.54],\n",
       "       [ 92.  ,   0.53],\n",
       "       [102.  ,   0.54],\n",
       "       [322.  ,   0.5 ],\n",
       "       [195.  ,   0.54],\n",
       "       [156.  ,   0.54],\n",
       "       [130.  ,   0.52],\n",
       "       [414.  ,   0.52],\n",
       "       [187.  ,   0.55],\n",
       "       [299.  ,   0.51],\n",
       "       [ 85.  ,   0.51],\n",
       "       [221.  ,   0.53],\n",
       "       [130.  ,   0.5 ],\n",
       "       [ 23.  ,   0.53],\n",
       "       [338.  ,   0.52],\n",
       "       [377.  ,   0.52],\n",
       "       [270.  ,   0.52],\n",
       "       [475.  ,   0.51],\n",
       "       [442.  ,   0.5 ],\n",
       "       [475.  ,   0.51],\n",
       "       [ 95.  ,   0.53],\n",
       "       [135.  ,   0.53],\n",
       "       [119.  ,   0.53],\n",
       "       [ 27.  ,   0.5 ],\n",
       "       [243.  ,   0.52],\n",
       "       [ 54.  ,   0.53],\n",
       "       [266.  ,   0.5 ],\n",
       "       [162.  ,   0.52],\n",
       "       [ 26.  ,   0.55],\n",
       "       [162.  ,   0.52],\n",
       "       [204.  ,   0.52],\n",
       "       [289.  ,   0.54],\n",
       "       [351.  ,   0.55],\n",
       "       [ 19.  ,   0.54],\n",
       "       [459.  ,   0.53],\n",
       "       [272.  ,   0.52],\n",
       "       [351.  ,   0.5 ],\n",
       "       [ 13.  ,   0.53],\n",
       "       [136.  ,   0.53],\n",
       "       [338.  ,   0.51],\n",
       "       [161.  ,   0.55],\n",
       "       [304.  ,   0.52],\n",
       "       [442.  ,   0.55],\n",
       "       [184.  ,   0.51],\n",
       "       [171.  ,   0.5 ],\n",
       "       [209.  ,   0.51],\n",
       "       [266.  ,   0.5 ],\n",
       "       [ 13.  ,   0.5 ],\n",
       "       [380.  ,   0.51],\n",
       "       [143.  ,   0.53],\n",
       "       [ 54.  ,   0.51],\n",
       "       [260.  ,   0.5 ],\n",
       "       [228.  ,   0.54],\n",
       "       [255.  ,   0.54],\n",
       "       [459.  ,   0.53],\n",
       "       [230.  ,   0.5 ],\n",
       "       [247.  ,   0.55],\n",
       "       [ 95.  ,   0.53],\n",
       "       [104.  ,   0.52]])"
      ]
     },
     "execution_count": 73,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test_feature = test_data[:,0:2]\n",
    "test_feature"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0.42207792, 0.6       ],\n",
       "       [0.67316017, 0.8       ],\n",
       "       [0.05411255, 0.        ],\n",
       "       [0.02164502, 0.4       ],\n",
       "       [0.5974026 , 1.        ],\n",
       "       [0.5974026 , 0.6       ],\n",
       "       [0.15584416, 0.2       ],\n",
       "       [0.55627706, 0.2       ],\n",
       "       [0.50649351, 0.6       ],\n",
       "       [0.95887446, 1.        ],\n",
       "       [0.52380952, 0.4       ],\n",
       "       [0.0952381 , 0.        ],\n",
       "       [0.26623377, 0.8       ],\n",
       "       [0.01298701, 0.8       ],\n",
       "       [0.45021645, 0.6       ],\n",
       "       [0.0952381 , 0.4       ],\n",
       "       [0.16883117, 0.2       ],\n",
       "       [0.50649351, 0.4       ],\n",
       "       [0.85497835, 0.4       ],\n",
       "       [0.4978355 , 0.2       ],\n",
       "       [0.59090909, 0.4       ],\n",
       "       [0.16883117, 0.        ],\n",
       "       [0.20562771, 0.2       ],\n",
       "       [0.36580087, 0.4       ],\n",
       "       [0.91774892, 0.2       ],\n",
       "       [0.95670996, 0.6       ],\n",
       "       [0.41991342, 1.        ],\n",
       "       [0.66883117, 0.8       ],\n",
       "       [0.91774892, 0.4       ],\n",
       "       [0.76839827, 0.2       ],\n",
       "       [0.03030303, 0.2       ],\n",
       "       [0.41341991, 0.6       ],\n",
       "       [0.41991342, 0.6       ],\n",
       "       [0.73160173, 0.6       ],\n",
       "       [0.53463203, 0.6       ],\n",
       "       [0.55627706, 0.4       ],\n",
       "       [0.38095238, 0.6       ],\n",
       "       [0.56277056, 0.6       ],\n",
       "       [0.61904762, 0.2       ],\n",
       "       [0.08225108, 0.8       ],\n",
       "       [0.08874459, 0.8       ],\n",
       "       [0.14718615, 0.8       ],\n",
       "       [0.84848485, 0.        ],\n",
       "       [0.39393939, 0.2       ],\n",
       "       [0.17748918, 0.4       ],\n",
       "       [0.26406926, 0.6       ],\n",
       "       [0.28138528, 0.4       ],\n",
       "       [0.61904762, 0.6       ],\n",
       "       [0.89177489, 1.        ],\n",
       "       [0.95670996, 0.2       ],\n",
       "       [0.71861472, 0.6       ],\n",
       "       [0.42207792, 0.8       ],\n",
       "       [0.41991342, 0.2       ],\n",
       "       [0.25324675, 0.8       ],\n",
       "       [0.42207792, 0.8       ],\n",
       "       [0.89177489, 0.2       ],\n",
       "       [0.59090909, 0.6       ],\n",
       "       [0.87229437, 0.4       ],\n",
       "       [0.08441558, 0.8       ],\n",
       "       [0.67099567, 0.8       ],\n",
       "       [0.96753247, 0.6       ],\n",
       "       [0.38095238, 0.8       ],\n",
       "       [0.17099567, 0.6       ],\n",
       "       [0.19264069, 0.8       ],\n",
       "       [0.66883117, 0.        ],\n",
       "       [0.39393939, 0.8       ],\n",
       "       [0.30952381, 0.8       ],\n",
       "       [0.25324675, 0.4       ],\n",
       "       [0.86796537, 0.4       ],\n",
       "       [0.37662338, 1.        ],\n",
       "       [0.61904762, 0.2       ],\n",
       "       [0.15584416, 0.2       ],\n",
       "       [0.45021645, 0.6       ],\n",
       "       [0.25324675, 0.        ],\n",
       "       [0.02164502, 0.6       ],\n",
       "       [0.7034632 , 0.4       ],\n",
       "       [0.78787879, 0.4       ],\n",
       "       [0.55627706, 0.4       ],\n",
       "       [1.        , 0.2       ],\n",
       "       [0.92857143, 0.        ],\n",
       "       [1.        , 0.2       ],\n",
       "       [0.17748918, 0.6       ],\n",
       "       [0.26406926, 0.6       ],\n",
       "       [0.22943723, 0.6       ],\n",
       "       [0.03030303, 0.        ],\n",
       "       [0.4978355 , 0.4       ],\n",
       "       [0.08874459, 0.6       ],\n",
       "       [0.54761905, 0.        ],\n",
       "       [0.32251082, 0.4       ],\n",
       "       [0.02813853, 1.        ],\n",
       "       [0.32251082, 0.4       ],\n",
       "       [0.41341991, 0.4       ],\n",
       "       [0.5974026 , 0.8       ],\n",
       "       [0.73160173, 1.        ],\n",
       "       [0.01298701, 0.8       ],\n",
       "       [0.96536797, 0.6       ],\n",
       "       [0.56060606, 0.4       ],\n",
       "       [0.73160173, 0.        ],\n",
       "       [0.        , 0.6       ],\n",
       "       [0.26623377, 0.6       ],\n",
       "       [0.7034632 , 0.2       ],\n",
       "       [0.32034632, 1.        ],\n",
       "       [0.62987013, 0.4       ],\n",
       "       [0.92857143, 1.        ],\n",
       "       [0.37012987, 0.2       ],\n",
       "       [0.34199134, 0.        ],\n",
       "       [0.42424242, 0.2       ],\n",
       "       [0.54761905, 0.        ],\n",
       "       [0.        , 0.        ],\n",
       "       [0.79437229, 0.2       ],\n",
       "       [0.28138528, 0.6       ],\n",
       "       [0.08874459, 0.2       ],\n",
       "       [0.53463203, 0.        ],\n",
       "       [0.46536797, 0.8       ],\n",
       "       [0.52380952, 0.8       ],\n",
       "       [0.96536797, 0.6       ],\n",
       "       [0.46969697, 0.        ],\n",
       "       [0.50649351, 1.        ],\n",
       "       [0.17748918, 0.6       ],\n",
       "       [0.1969697 , 0.4       ]])"
      ]
     },
     "execution_count": 74,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test_feature = min_max(test_feature)\n",
    "test_feature"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {},
   "outputs": [],
   "source": [
    "train_label = train_data[:, -1:].astype(int)\n",
    "test_label = test_data[:, -1:].astype(int)\n",
    "\n",
    "def test_accuary(k):\n",
    "    total_count = 0\n",
    "    for index, item in enumerate(test_feature):\n",
    "        predict = knn(train_feature, train_label, item, k)\n",
    "        real = test_label[index][0]\n",
    "        # print(predict, real)\n",
    "        if predict == real:\n",
    "            total_count +=1\n",
    "            \n",
    "    print(\"k={}, accuary:{}\".format(k, total_count / len(test_data)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4"
      ]
     },
     "execution_count": 80,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "predict_point = np.array([300, 0.53])\n",
    "predict = knn(train_feature, train_label, predict_point, 43)\n",
    "predict"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "k=3, accuary:0.2916666666666667\n",
      "k=4, accuary:0.26666666666666666\n",
      "k=5, accuary:0.275\n",
      "k=6, accuary:0.25\n",
      "k=7, accuary:0.23333333333333334\n",
      "k=8, accuary:0.225\n",
      "k=9, accuary:0.20833333333333334\n",
      "k=10, accuary:0.25833333333333336\n",
      "k=11, accuary:0.2833333333333333\n",
      "k=12, accuary:0.2833333333333333\n",
      "k=13, accuary:0.31666666666666665\n",
      "k=14, accuary:0.3333333333333333\n",
      "k=15, accuary:0.31666666666666665\n",
      "k=16, accuary:0.2916666666666667\n",
      "k=17, accuary:0.3\n",
      "k=18, accuary:0.30833333333333335\n",
      "k=19, accuary:0.30833333333333335\n",
      "k=20, accuary:0.26666666666666666\n",
      "k=21, accuary:0.2833333333333333\n",
      "k=22, accuary:0.275\n",
      "k=23, accuary:0.25\n",
      "k=24, accuary:0.24166666666666667\n",
      "k=25, accuary:0.24166666666666667\n",
      "k=26, accuary:0.25\n",
      "k=27, accuary:0.24166666666666667\n",
      "k=28, accuary:0.25833333333333336\n",
      "k=29, accuary:0.25\n",
      "k=30, accuary:0.26666666666666666\n",
      "k=31, accuary:0.25833333333333336\n",
      "k=32, accuary:0.275\n",
      "k=33, accuary:0.25833333333333336\n",
      "k=34, accuary:0.25833333333333336\n",
      "k=35, accuary:0.25833333333333336\n",
      "k=36, accuary:0.275\n",
      "k=37, accuary:0.2833333333333333\n",
      "k=38, accuary:0.275\n",
      "k=39, accuary:0.24166666666666667\n",
      "k=40, accuary:0.26666666666666666\n",
      "k=41, accuary:0.26666666666666666\n",
      "k=42, accuary:0.275\n",
      "k=43, accuary:0.30833333333333335\n",
      "k=44, accuary:0.2916666666666667\n",
      "k=45, accuary:0.275\n",
      "k=46, accuary:0.25833333333333336\n",
      "k=47, accuary:0.24166666666666667\n",
      "k=48, accuary:0.21666666666666667\n",
      "k=49, accuary:0.25\n",
      "k=50, accuary:0.24166666666666667\n",
      "k=51, accuary:0.25\n",
      "k=52, accuary:0.225\n",
      "k=53, accuary:0.19166666666666668\n",
      "k=54, accuary:0.21666666666666667\n",
      "k=55, accuary:0.20833333333333334\n",
      "k=56, accuary:0.225\n",
      "k=57, accuary:0.23333333333333334\n",
      "k=58, accuary:0.23333333333333334\n",
      "k=59, accuary:0.23333333333333334\n",
      "k=60, accuary:0.25833333333333336\n",
      "k=61, accuary:0.25833333333333336\n",
      "k=62, accuary:0.25833333333333336\n",
      "k=63, accuary:0.25\n",
      "k=64, accuary:0.25833333333333336\n",
      "k=65, accuary:0.275\n",
      "k=66, accuary:0.26666666666666666\n",
      "k=67, accuary:0.25833333333333336\n",
      "k=68, accuary:0.25833333333333336\n",
      "k=69, accuary:0.25\n",
      "k=70, accuary:0.25833333333333336\n",
      "k=71, accuary:0.25\n",
      "k=72, accuary:0.25833333333333336\n",
      "k=73, accuary:0.275\n",
      "k=74, accuary:0.2833333333333333\n",
      "k=75, accuary:0.3\n",
      "k=76, accuary:0.3\n",
      "k=77, accuary:0.2916666666666667\n",
      "k=78, accuary:0.26666666666666666\n",
      "k=79, accuary:0.275\n",
      "k=80, accuary:0.26666666666666666\n",
      "k=81, accuary:0.2833333333333333\n",
      "k=82, accuary:0.25833333333333336\n",
      "k=83, accuary:0.26666666666666666\n",
      "k=84, accuary:0.25\n",
      "k=85, accuary:0.26666666666666666\n",
      "k=86, accuary:0.25833333333333336\n",
      "k=87, accuary:0.25833333333333336\n",
      "k=88, accuary:0.275\n",
      "k=89, accuary:0.26666666666666666\n",
      "k=90, accuary:0.26666666666666666\n",
      "k=91, accuary:0.25833333333333336\n",
      "k=92, accuary:0.25833333333333336\n",
      "k=93, accuary:0.25833333333333336\n",
      "k=94, accuary:0.24166666666666667\n",
      "k=95, accuary:0.24166666666666667\n",
      "k=96, accuary:0.25\n",
      "k=97, accuary:0.23333333333333334\n",
      "k=98, accuary:0.23333333333333334\n",
      "k=99, accuary:0.25833333333333336\n"
     ]
    }
   ],
   "source": [
    "for k in range(3, 100):\n",
    "    test_accuary(k)\n",
    "    \n",
    "# test_accuary(5)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
